home *** CD-ROM | disk | FTP | other *** search
/ 130 MIDI Tool Box / 130 MIDI Tool Box.iso / midifile / mftext.c < prev    next >
C/C++ Source or Header  |  1989-03-05  |  4KB  |  251 lines

  1. /*
  2.  * mftext
  3.  * 
  4.  * Convert a MIDI file to verbose text.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include "midifile.h"
  10.  
  11. static FILE *F;
  12.  
  13. filegetc()
  14. {
  15.     return(getc(F));
  16. }
  17.  
  18. main(argc,argv)
  19. char **argv;
  20. {
  21.     FILE *efopen();
  22.  
  23.     if ( argc > 1 )
  24.         F = efopen(argv[1],"r");
  25.     else
  26.         F = stdin;
  27.  
  28.     initfuncs();
  29.     Mf_getc = filegetc;
  30.     midifile();
  31.     fclose(F);
  32.     exit(0);
  33. }
  34.  
  35. FILE *
  36. efopen(name,mode)
  37. char *name;
  38. char *mode;
  39. {
  40.     FILE *f;
  41.     extern int errno;
  42.     extern char *sys_errlist[];
  43.     extern int sys_nerr;
  44.     char *errmess;
  45.  
  46.     if ( (f=fopen(name,mode)) == NULL ) {
  47.         (void) fprintf(stderr,"*** ERROR *** Cannot open '%s'!\n",name);
  48.         if ( errno <= sys_nerr )
  49.             errmess = sys_errlist[errno];
  50.         else
  51.             errmess = "Unknown error!";
  52.         (void) fprintf(stderr,"************* Reason: %s\n",errmess);
  53.         exit(1);
  54.     }
  55.     return(f);
  56. }
  57.  
  58. error(s)
  59. char *s;
  60. {
  61.     fprintf(stderr,"Error: %s\n",s);
  62. }
  63.  
  64. txt_header(format,ntrks,division)
  65. {
  66.     printf("Header format=%d ntrks=%d division=%d\n",format,ntrks,division);
  67. }
  68.  
  69. txt_trackstart()
  70. {
  71.     printf("Track start\n");
  72. }
  73.  
  74. txt_trackend()
  75. {
  76.     printf("Track end\n");
  77. }
  78.  
  79. txt_noteon(chan,pitch,vol)
  80. {
  81.     prtime();
  82.     printf("Note on, chan=%d pitch=%d vol=%d\n",chan+1,pitch,vol);
  83. }
  84.  
  85. txt_noteoff(chan,pitch,vol)
  86. {
  87.     prtime();
  88.     printf("Note off, chan=%d pitch=%d vol=%d\n",chan+1,pitch,vol);
  89. }
  90.  
  91. txt_pressure(chan,pitch,press)
  92. {
  93.     prtime();
  94.     printf("Pressure, chan=%d pitch=%d press=%d\n",chan+1,pitch,press);
  95. }
  96.  
  97. txt_parameter(chan,control,value)
  98. {
  99.     prtime();
  100.     printf("Parameter, chan=%d c1=%d c2=%d\n",chan+1,control,value);
  101. }
  102.  
  103. txt_pitchbend(chan,msb,lsb)
  104. {
  105.     prtime();
  106.     printf("Pitchbend, chan=%d msb=%d lsb=%d\n",chan+1,msb,lsb);
  107. }
  108.  
  109. txt_program(chan,program)
  110. {
  111.     prtime();
  112.     printf("Program, chan=%d program=%d\n",chan+1,program);
  113. }
  114.  
  115. txt_chanpressure(chan,press)
  116. {
  117.     prtime();
  118.     printf("Channel pressure, chan=%d pressure=%d\n",chan+1,press);
  119. }
  120.  
  121. txt_sysex(leng,mess)
  122. char *mess;
  123. {
  124.     prtime();
  125.     printf("Sysex, leng=%d\n",leng);
  126. }
  127.  
  128. txt_metamisc(type,leng,mess)
  129. char *mess;
  130. {
  131.     prtime();
  132.     printf("Meta event, unrecognized, type=0x%02x leng=%d\n",type,leng);
  133. }
  134.  
  135. txt_metaspecial(type,leng,mess)
  136. char *mess;
  137. {
  138.     prtime();
  139.     printf("Meta event, sequencer-specific, type=0x%02x leng=%d\n",type,leng);
  140. }
  141.  
  142. txt_metatext(type,leng,mess)
  143. char *mess;
  144. {
  145.     static char *ttype[] = {
  146.         NULL,
  147.         "Text Event",        /* type=0x01 */
  148.         "Copyright Notice",    /* type=0x02 */
  149.         "Sequence/Track Name",
  150.         "Instrument Name",    /* ...       */
  151.         "Lyric",
  152.         "Marker",
  153.         "Cue Point",        /* type=0x07 */
  154.         "Unrecognized"
  155.     };
  156.     int unrecognized = (sizeof(ttype)/sizeof(char *)) - 1;
  157.     register int n, c;
  158.     register char *p = mess;
  159.  
  160.     if ( type < 1 || type > unrecognized )
  161.         type = unrecognized;
  162.     prtime();
  163.     printf("Meta Text, type=0x%02x (%s)  leng=%d\n",type,ttype[type],leng);
  164.     printf("     Text = <");
  165.     for ( n=0; n<leng; n++ ) {
  166.         c = *p++;
  167.         printf( (isprint(c)||isspace(c)) ? "%c" : "\\0x%02x" , c);
  168.     }
  169.     printf(">\n");
  170. }
  171.  
  172. txt_metaseq(num)
  173. {
  174.     prtime();
  175.     printf("Meta event, sequence number = %d\n",num);
  176. }
  177.  
  178. txt_metaeot()
  179. {
  180.     prtime();
  181.     printf("Meta event, end of track\n");
  182. }
  183.  
  184. txt_keysig(sf,mi)
  185. {
  186.     prtime();
  187.     printf("Key signature, sharp/flats=%d  minor=%d\n",sf,mi);
  188. }
  189.  
  190. txt_tempo(tempo)
  191. long tempo;
  192. {
  193.     prtime();
  194.     printf("Tempo, microseconds-per-MIDI-quarter-note=%d\n",tempo);
  195. }
  196.  
  197. txt_timesig(nn,dd,cc,bb)
  198. {
  199.     int denom = 1;
  200.     while ( dd-- > 0 )
  201.         denom *= 2;
  202.     prtime();
  203.     printf("Time signature=%d/%d  MIDI-clocks/click=%d  32nd-notes/24-MIDI-clocks=%d\n",
  204.         nn,denom,cc,bb);
  205. }
  206.  
  207. txt_smpte(hr,mn,se,fr,ff)
  208. {
  209.     prtime();
  210.     printf("SMPTE, hour=%d minute=%d second=%d frame=%d fract-frame=%d\n",
  211.         hr,mn,se,fr,ff);
  212. }
  213.  
  214. txt_arbitrary(leng,mess)
  215. char *mess;
  216. {
  217.     prtime();
  218.     printf("Arbitrary bytes, leng=%d\n",leng);
  219. }
  220.  
  221. prtime()
  222. {
  223.     printf("Time=%ld  ",Mf_currtime);
  224. }
  225.  
  226. initfuncs()
  227. {
  228.     Mf_error = error;
  229.     Mf_header =  txt_header;
  230.     Mf_starttrack =  txt_trackstart;
  231.     Mf_endtrack =  txt_trackend;
  232.     Mf_on =  txt_noteon;
  233.     Mf_off =  txt_noteoff;
  234.     Mf_pressure =  txt_pressure;
  235.     Mf_controller =  txt_parameter;
  236.     Mf_pitchbend =  txt_pitchbend;
  237.     Mf_program =  txt_program;
  238.     Mf_chanpressure =  txt_chanpressure;
  239.     Mf_sysex =  txt_sysex;
  240.     Mf_metamisc =  txt_metamisc;
  241.     Mf_seqnum =  txt_metaseq;
  242.     Mf_eot =  txt_metaeot;
  243.     Mf_timesig =  txt_timesig;
  244.     Mf_smpte =  txt_smpte;
  245.     Mf_tempo =  txt_tempo;
  246.     Mf_keysig =  txt_keysig;
  247.     Mf_sqspecific =  txt_metaspecial;
  248.     Mf_text =  txt_metatext;
  249.     Mf_arbitrary =  txt_arbitrary;
  250. }
  251.